#include "stdio.h"
#define  MAXSIZE 100
#include <malloc.h>
#include <iostream>
using namespace std;

typedef int datatype;
typedef struct
{
	datatype data;
	int  cur;
}component, SList[MAXSIZE];
SList space;

datatype a[]={2,3,4};
datatype b[]={3,4,5,};

int head,rear;

int locate(SList &s, datatype e);
void initspace_sl(SList &space) ;
int malloc_sl(SList &space);
void  free_sl(SList &space, int k) ;
void Createlist(SList &space,int m);
void different(SList &space, int &s,int n);
void show(int &s);

int  main()
{
	int m,n;
	initspace_sl(space);
	Createlist(space,m);
	cout<<"\nOriginal set A:\n";
	show(head);

	different(space,head,n);
	cout<<"\nSet((A-B)and(B-A)):\n";
	show(head);
}

int locate(SList &s, datatype e)
{
	int i=s[0].cur;
	while (i&&s[i].data!=e)
		i=s[i].cur;                 //链向后继
	return i;
}

void initspace_sl(SList &space)   //初始化备用链表
{
	for (int i=0; i<MAXSIZE-1; ++i)
        space[i].cur=i+1;
	space[MAXSIZE-1].cur=0;
}

int malloc_sl(SList &space)        //分配备用链首结点给链表新节点
{
	int i=space[0].cur;
	if (space[0].cur) space[0].cur=space[i].cur;
	return i;
}

void  free_sl(SList &space, int k)  //回收结点进入备用链首
{
	space[k].cur=space[0].cur;
	space[0].cur=k;
}

void Createlist(SList &space,int m)
{
	head=malloc_sl(space);rear=head;      //初始化链表头结点
	for (int i=0; i<3; i++)
	{
		int s=malloc_sl(space);         //分配节点空间
		space[s].data=a[i];             //节点赋值
		space[rear].cur=s;                 //新结点插入链尾
		rear=s;                            //尾指针刷新
	}
	space[rear].cur=0 ;                    //置链尾标志
}

void different(SList &space, int &s,int n)
{
    int i;
    cout<<"Set B: \n";
    for (i=0; i<2; i++ )
        cout<<" "<<b[i]<<"-->";
    cout<<b[i]<<endl;

	for (i=0; i<3; i++ )
	{
		int p,k;
		p=s;			     /*p用来存放访问结点的前驱 */
		k=space[s].cur ;

		while (k!=space[rear].cur&&space[k].data!=b[i])    /*在表中查找*/
		{
			p=k;
			k=space[k].cur;
		}

		if (k==space[rear].cur)		/* 搜索到表尾,无需插入*/
		{
			int s=malloc_sl(space);
			space[s].data=b[i] ;
			space[s].cur=space[rear].cur;
			space[rear].cur=s ;
		}					/* 插在r的后面 */
		else                /* 搜索到相同元素，需删除*/
		{
			space[p].cur=space[k].cur;
			free_sl(space,k);
			if (rear==k) rear=p;
		}
	}
}

void show(int &s)
{
	int i;
	i=s;
	i=space[i].cur;
	while (space[i].cur!=0)    //在表中查找
	{
		cout<<" "<<space[i].data<<"-->";
		i=space[i].cur;
	}
	cout<<space[i].data<<endl;
}
